package SocketLearn;




import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.RandomAccess;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-06 8:10
 * @description 随机存取文件流（能存取也能读取）
 * 1.直接继承于java.lang.Object,实现了DataInput和DataOutput接口，
 * 2.可输入也可输出
 * 3.如果作为输出流时，写出到的文件如果不存在，则执行过程中自动创建
 *   如果文件存在，则会对原有文件的内容进行覆盖。（默认情况下，从头覆盖）
 *
 *
 *
 */
public class RandomAccessFileTest {
    @Test
    public void test1() throws IOException {
        String path="D:\\Java Learn\\IOLearnTestFile\\king exit\\真是不祥的刀刃啊.png";
        String path2="D:\\Java Learn\\IOLearnTestFile\\picturetest\\真是不祥的刀刃啊.png";
        RandomAccessFile raf1=new RandomAccessFile(new File(path),"r");
        RandomAccessFile raf2=new RandomAccessFile(new File(path2),"rw");

        byte[] buffer=new byte[1024];
        int len;
        while((len=raf1.read(buffer))!=-1){
            raf2.write(buffer,0,len);
        }
        raf1.close();
        raf2.close();
        System.out.println("复制完成！");
    }

    /**
     * 对字符文件的覆盖:
     *
     */
    @Test
    public void test2() throws IOException {
        String path1="D:\\Java Learn\\IOLearnTestFile\\testtext\\text.txt";
        String path2="D:\\Java Learn\\IOLearnTestFile\\testtext\\text_clone.txt";

        RandomAccessFile raf1=new RandomAccessFile(path2,"rw");
        raf1.seek(2);//指针定位到第三个位置，并从覆盖第三个位置开始写入
        raf1.write("123".getBytes());
        raf1.close();
    }

    /**
     * 使用RandomAccessFile实现插入效果
     *
     */
    @Test
    public void test3() throws IOException{
        String path1="D:\\Java Learn\\IOLearnTestFile\\testtext\\text.txt";
        RandomAccessFile raf1=new RandomAccessFile(path1,"rw");
        raf1.seek(6);//将指针放到角标为6的位置(汉字一个3字节)
        StringBuilder sb=new StringBuilder((int)new File(path1).length());
        //保存指针6后面的所有数据，并写入sb中
        byte[] buffer=new byte[20];
        int len;
        while((len=raf1.read(buffer))!=-1){
            sb.append(new String(buffer,0,len));
        }
        //调回指针，写入插入内容
        raf1.seek(6);
        raf1.write("（这是插入的内容）".getBytes());
        //将sb的数据重新写入文件
        raf1.write(sb.toString().getBytes());
        raf1.close();

        //思考：可以将StringBuilder换成ByteArraysOutputStream

    }
}
